const path = require('path');
const express = require('express');
const expressJwt = require('express-jwt')
var bodyParser = require('body-parser');   //body解析
var cors = require('cors'); 


const userRouter = require('./routers/user');
const typeRouter = require('./routers/type');
const billRouter = require('./routers/bill');
const {SECRET} = require('./config/config');

const app = express();

// 为应用使用中间件
// 静态文件中间件
app.use(express.static(path.join(__dirname, '../public')));

// 请求体 parse 中间件，用于 parse json 格式请求体
app.use(express.json());
// app.use(express.urlencoded())
app.use(expressJwt({
  secret: SECRET,
  algorithms: ['HS256'],
}).unless({
  path: ['/api/user/register', '/api/user/login']
}))

app.use(bodyParser.json())
.use(bodyParser.urlencoded({ extended: true }))
.use(function (req, res, next) {
     //跨域处理
     res.setHeader('Access-Control-Allow-Origin', '*');  //允许任何源
     res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');  
     res.setHeader('Access-Control-Allow-Headers', '*');   //允许任何类型  
    next();  //next 方法就是一个递归调用
});
app.use(cors())


app.use('/api/user', userRouter);
app.use('/api/type', typeRouter);
app.use('/api/bill', billRouter);

app.use(notFound);
app.use(errorHandler);


function notFound(req, res) {
  res.status(404);
  res.send({
    error: 'not found'
  });
}

function errorHandler(err, req, res, next) {
  // 抛出的错误可以附带 status 字段，代表 http 状态码
  // 若没有提供，则默认状态码为 500，代表服务器内部错误
  console.log(err.status)
  if (err.status === 401) {
    console.log(err.message)
    if (err.message === 'jwt expired') 
      return res.send({state: 1, info: 'token失效'});
    else
      return res.send({state: 1, info: '未携带token或token未授权'});
  }
  res.status(err.status || 500);
  res.send({error: err.message});
}

// 导出 Express 对象
module.exports = app;
